# -*- coding: utf-8 -*-
# @Time    : 2018/11/22 15:10
# @Author  : qianjun
# @FileName: AuthorOrganSort.py
# @Software: PyCharm
"""
介绍：该函数用于处理作者与机构编号的问题，需要足以的是：传入的值为字典的模式，key为作者，value为机构，如果该作者对应了多个机构，需要用将多个机构分割开
例如：d = {"qj":"a;b","tjj" :"a","jty":"c","zxl":"","qwer":"z;x;n"}
返回：本函数返回的是元组：第一个元素是编好号的作者，第二个元素是编号号的机构
用法：SortCreatorOrgan（）message，传入的值为一个字典
"""
d = {"qj": "a;b", "tjj": "a", "jty": "c", "zxl": "", "qwer": "z;x;n"}
d = {"qj": "", "tjj": "", "d": "", }


# 获取所有机构，并且去重
def GetAllOrgan(message):
    # 定义一个列表，存储所有机构，未将多个机构的值进行拆分
    all_organ_list = list()

    for author, organ in message.items():
        all_organ_list.append(organ)

    # 存储所有的机构
    organ_list = list()

    # 一个作者可能对应多个机构，因此需要将所获取到的机构，进行拆分
    # 传入值的时候，多个机构应当用分号切分，例如：{”author":"organ1;organ2"}
    # 将机构遍历出来，并且进行去重
    for organ in all_organ_list:
        if organ:
            if organ.find(";") != -1:

                deal_organ = organ.split(";")

                # 将拆分的机构添加到列表中去
                for next_organ in deal_organ:
                    organ_list.append(next_organ)
            else:

                organ_list.append(organ)

    # 将拆分后的机构，进行去重处理

    distinct_organ_list = sorted(set(organ_list), key=organ_list.index)

    return distinct_organ_list


# 将去重后的机构进行编号
def SortOrgan(distinct_organ_list):
    # distinct_organ_list =GetAllOrgan(message)

    # 用于存储，编好号的机构
    organ_Sort_num = ""

    if distinct_organ_list:

        for organ in distinct_organ_list:
            # 获取该元素，在列表中的下标，进行+1编号
            num = distinct_organ_list.index(organ) + 1

            organ_Sort_num = organ_Sort_num + "[" + str(num) + "]" + organ + ";"

    return organ_Sort_num


# #根据机构编号去对应相关作者，并且返回，编好的作者和机构

def SortCreatorOrgan(message):
    # 去重后的机构列表
    distinct_organ_list = GetAllOrgan(message)
    # print(distinct_organ_list)

    # 将去重后的机构列表进行排序
    organ_Sort_num = SortOrgan(distinct_organ_list)
    # print(organ_Sort_num)

    # 定义一个作者的空字段

    creator = ""

    for key, value in message.items():
        author = key

        organs = value

        # 当作者有对应的机构时，需要进行对应编号

        if organs:

            if organs.find(";") != -1:

                # 则说明，该作者对应了多个机构
                # 将该作者对应的机构进行拆分

                organs_deal = organs.split(";")
                # print(organs_deal)

                author_num_test = ""

                # 遍历所拆分后的机构
                for i in organs_deal:

                    # 如果这个机构，在编号号的机构中，进行获取下标，将作者与机构相对应
                    if i in distinct_organ_list:
                        # 组织编号，因为机构的编号，也是通过去重后的distinct_organ_list获取下标+1得到的
                        # 故获取到该作者对应的机构在distinct_organ_list列表中的下标进行+1，即可对应相关的机构标号

                        author_num = distinct_organ_list.index(i)

                        # 初步组织所有作者
                        author = author + str(author_num + 1) + ","

                author_test = key + "["

                author = (author.strip(", ") + "]").replace(key, author_test)

                creator = creator + author + ";"




            else:

                # 该情况是处理作者与机构1-1对应的情况

                author_num = distinct_organ_list.index(organs)

                author = author + "[" + str(author_num + 1) + "]"

                creator = creator + author + ";"


        else:

            # 该i情况是说明，只有作者，没有对应的机构

            creator = creator + author + ";"
    creator = creator.strip("; ")
    organ_Sort_num = organ_Sort_num.strip("; ")
    return creator, organ_Sort_num
